# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.

class ApplicationController < ActionController::Base

  include AuthenticatedSystem
  include RoleRequirement

  # Siempre que haya un xhr (XmlHttpRequest) request (osea ajax) el layout es false
  # caso contrario el layout es application
  layout proc{ |c| c.request.xhr? ? false : "application" }

#
#  SESSION CONTROL
#

  # Pick a unique cookie name to distinguish our session data from others'
  session :session_key => '_swadmin_session_id'

  # Timeout after inactivity
  MAX_SESSION_PERIOD = 20.minutes

  # siempre verificar el estado de la session
  before_filter :session_expiry
  # siempre inicializar nombre de controller y action
  before_filter :initiate_controller_action_name
  
  def session_expiry
     # si expira el tiempo de la sesion la resetea entonces el usuario deja de estar logged_in
     reset_session if session[:expiry_time] and session[:expiry_time] < Time.now
     
     unless request.xhr?
       # solo renuevo la session si el request no fue de ajax.
       # FIXME de esta manera los ajax periodicos no joden, pero los links hechos en ajax no cuentan como "actividad"
       # una manera de solucionar esto seria agregar un header a los calls periodicos e ignorar solamente esos.
       session[:expiry_time] = MAX_SESSION_PERIOD.from_now 
       K_LOGGER.debug "Renuevo la session. #{MAX_SESSION_PERIOD} segundos."
     end
     return true
  end

  def initiate_controller_action_name
    @current_controller = params[:controller]
    @current_action = params[:action]
  end
  
#  
#  FUNCIONES DE ACCESO GENERAL
#  
  
  # Crea @persona_pages, @personas, @page, @lnk_frm y @lnk_to para paginacion de personas.
  # filtra de acuerdo a params[:nombres, :apellidos, :mail, :profesion]
  # por ejemplo para paginar los alumnos:
  # paginar_personas "coeficiente_id={Coeficiente::ALUMNO}"
  # filtra segun nombres, apellidos, mail, profesion
  def paginar_personas(coef_cond)

    query = "(#{coef_cond})"
    binds = Array.new
    if (params[:nombres] and (params[:nombres]!=''))
      query << " AND nombres like ?"
      binds << "#{params[:nombres]}%"
    end
    if (params[:apellidos] and (params[:apellidos]!=''))
      query << " AND apellidos like ?" 
      binds << "#{params[:apellidos]}%"
    end
    if (params[:mail] and (params[:mail]!=''))
      query << " AND mail like ?" 
      binds << "#{params[:mail]}%"
    end
    if (params[:profesion] and (params[:profesion]!=''))
      query << " AND profesion like ?" 
      binds << "#{params[:profesion]}%"
    end
       
    @persona_pages, @personas = paginate :personas,:per_page => 15, :order => 'nombres, apellidos',
      :conditions=>[query,binds].flatten
    @page, @lnk_from, @lnk_to = numeros_pagina @persona_pages
  end  

  # devuelve @page, @lnk_from, @lnk_to donde
  # @page es la pagina actual
  # @lnk_from es el primer link a pagina
  # @lnk_to es el ultimo link a pagin
  # EJEMPLO
  # @page, @lnk_from, @lnk_to = numeros_pagina @paginas
  # donde @page = 12, @lnk_from = 10 y @link_to = 14 imprime con el partial: personas/numeros_pagina
  # 1...10, 11, 12, 13, 14 ... 50
  def numeros_pagina(paginas)
    page = params[:page]? params[:page].to_i : 1
    lnk_from = (page > 3)? page-3 : 1
    lnk_to = ((page + 3) <= paginas.last.number)? page+3 : paginas.last.number
    return page, lnk_from, lnk_to
  end
  
  #redirige al show que le correspondo por su coeficiente_id
  def redirect_to_show(persona)
    case persona.coeficiente_id
    when Coeficiente::ALUMNO
      controller='alumnos'
    when Coeficiente::EXALUMNO
      controller='exalumnos'
    else
      controller='prospects'
    end
    redirect_to :action=>'show', :controller=>controller, :id=>persona
  end
  
  def redirect_to_edit(persona)
    case persona.coeficiente_id
    when Coeficiente::ALUMNO
      controller='alumnos'
    when Coeficiente::EXALUMNO
      controller='exalumnos'
    else
      controller='prospects'
    end
    redirect_to :action=>'edit', :controller=>controller, :id=>persona
  end


  # Atrapa las excepciones que lleguen hasta arriba.
  def rescue_action_in_public(exception)
    case exception
      when ArgumentError
        flash[:error] = "Error<br/>#{exception.message}"
        redirect_back_or_default :controller=>'main'
      when ActionController::RoutingError
        flash[:error] = "P&aacute;gina no encontrada."
        redirect_back_or_default :controller=>'main'
      else
        K_LOGGER.error "Rescue_action_in_public exception: #{exception.inspect}."
        K_MAILER.deliver_error_log "Excepcion no atrapada", exception
    end    
  end
  
  def local_request?
    false
  end
end